// Copyright (c) 2012, Hazen Eckert
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the The University of Texas at Dallas nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT DALLAS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef _auv_driver_H
#define _auv_driver_H

#include <stdint.h>
#include <stdio.h>
#include <strings.h>
#include "auv_driver_common/Serial.h"

using namespace std;

class auv_driver {

public:
    auv_driver();
    virtual ~auv_driver();
    void open(const char *port, long baud);
    void close();
    int getProcessorType( uint8_t *family, uint8_t *specific);
    int getSoftwareVersion( uint16_t *major, uint16_t *minor, uint16_t *incremental );
    int getProcessorDescription( char **stringBuffer );	
    int getMaxPayload( uint8_t *requestBufferSize, uint8_t *responseBufferSize );
    int getBoardFunction( uint8_t *boardFunction );
    int getBoardSerialNumber( char **stringBuffer );
    int getBoardDescription( char **stringBuffer );
    int getBoardStatus( uint8_t *boardStatus );
    int getBoardVoltage( float *boardVoltage );
    int getBoardCurrent( float *boardCurrent );
    int resetCommunication();
    int resetMicrocontroller();
    int storeStatus( uint8_t options, uint8_t *storageType, uint8_t *status );
    bool isOpened();

protected:
    typedef struct {
        uint8_t type;
        uint8_t flags;
        uint8_t length;
        uint8_t *data;
    } ICDpacket;
    typedef char driver_state;
    static const driver_state CLOSED = 0;
    static const driver_state OPENED = 1;
    uint8_t checksum( char *buffer, int length );
    void sendICDpacket( ICDpacket *packet );
    ICDpacket * recieveICDpacket();
    Serial *serial;
    driver_state driverState;
    

};

#endif 
